package org.yunai.swjg.server.module.inventory.item;

import org.yunai.yfserver.enums.IndexedEnum;

import java.util.List;

/**
 * 道具相关类型、常量定义
 * User: yunai
 * Date: 13-4-6
 * Time: 下午2:12
 */
public interface ItemDef {

    /**
     * 道具身份类型<br />
     * 一级属性
     */
    public static enum IdentityType implements IndexedEnum {
        /**
         * 空
         */
        NULL(0),
        /**
         * 装备
         */
        EQUIPMENT(10),
        /**
         * 消耗品
         */
        CONSUMABLE(11),
        /**
         * 卷轴
         */
        REEL(12),
        /**
         * 材料
         */
        MATERIAL(13);

        private final int index;

        private IdentityType(int index) {
            this.index = index;
        }

        public static final List<IdentityType> VALUES = Util.toIndexes(values());

        public static IdentityType valueOf(Integer index) {
            return Util.valueOf(VALUES, index);
        }

        @Override
        public int getIndex() {
            return index;
        }
    }

    /**
     * 道具类型<br />
     * 二级属性
     */
    public static enum Type implements IndexedEnum {
        /**
         * 空类型
         */
        NULL(0, null),

        // ==================== 装备 ====================
        /**
         * 主手武器
         */
        MAIN_HAND(101, IdentityType.EQUIPMENT),
        /**
         * 副手武器
         */
        OFF_HAND(102, IdentityType.EQUIPMENT),
        /**
         * 衣服
         */
        CLOTHES(103, IdentityType.EQUIPMENT),
        /**
         * 头盔
         */
        CAP(104, IdentityType.EQUIPMENT),
        /**
         * 坐骑
         */
        MOUNT(105, IdentityType.EQUIPMENT),
        /**
         * 腰带
         */
        WAISTBAND(106, IdentityType.EQUIPMENT),

        // ==================== 卷轴 ====================
        /**
         * 装备合成卷轴
         */
        EQUIP_REEL(121, IdentityType.REEL),

        // ==================== 材料 ====================
        /**
         * 任务材料
         */
        QUEST_MATERIAL(131, IdentityType.MATERIAL),
        /**
         * 合成材料
         */
        SYNTHETIC_MATERIAL(132, IdentityType.MATERIAL),
        ;

        public final int index;
        /**
         * 所属大类
         */
        public final IdentityType identityType;

        private Type(int index, IdentityType identityType) {
            this.index = index;
            this.identityType = identityType;
        }

        @Override
        public int getIndex() {
            return index;
        }

        public IdentityType getIdentityType() {
            return identityType;
        }

        /**
         * 是否是装备类型
         *
         * @return
         */
        public boolean isEquipment() {
            return IdentityType.EQUIPMENT == identityType;
        }

        private static final List<Type> values = IndexedEnum.Util.toIndexes(Type.values());

        public static Type valueOf(int index) {
            return IndexedEnum.Util.valueOf(values, index);
        }
    }

    /**
     * 装备部位枚举
     * TODO 可能没用
     */
    public static enum EquipPosition implements IndexedEnum {
        NULL(0, false),
        /**
         * 主手武器
         */
        MAIN_HAND(1, true),
        /**
         * 副手武器
         */
        OFF_HAND(2, true),
        /**
         * 衣服
         */
        CLOTHES(3, true),
        /**
         * 头盔
         */
        CAP(4, true),
        /**
         * 坐骑
         */
        MOUNT(5, true),
        /**
         * 腰带
         */
        WAISTBAND(6, false);

        private final int index;
        /**
         * 换装是否需要更换外表
         */
        private final boolean needSwitchAvatar;

        private EquipPosition(int index, boolean needSwitchAvatar) {
            this.index = index;
            this.needSwitchAvatar = needSwitchAvatar;
        }

        @Override
        public int getIndex() {
            return index;
        }
    }

    /**
     * 装备属性名称
     * TODO 看看以后能不能改成IndexedEnum
     * TODO 可能没用
     */
    public static enum EquipProps {
        /**
         * 攻击
         */
        ATK("atk"),
        /**
         * 防御
         */
        DEF("def"),
        /**
         * HP
         */
        HP("hp"),
        /**
         * MP
         */
        MP("mp"),
        /**
         * 攻速
         */
        ATK_SPD("atkSpd"),
        /**
         * 移动速度
         */
        MOVE_SPD("moveSpd"),
        /**
         * 暴击率
         */
        CRI("cri"),
        /**
         * 闪避率
         */
        DODGE("dodge"),
        /**
         * 反伤
         */
        FANSHANG("fanShang"),
        /**
         * 分裂攻击
         */
        CLEAVE("cleave"),
        /**
         * 免伤
         */
        MIANSHANG("mianShang");

        /**
         * 枚举对应英文
         */
        private String value;

        private EquipProps(String value) {
            this.value = value;

        }

        public String getValue() {
            return value;
        }

        //        public static EquipProps valueBy(String value) {
//            for (EquipProps e : values()) {
//                if (e.getValue().equals(value)) return e;
//            }
//            return null;
//        }
//
//        public String getValue() {
//            return this.value;
//        }
//
//        public String toString() {
//            return this.value;
//        }

    }
}
